package com.atguigu.juc.study.chapter14.rwlock;

import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 *  锁降级：
 *      遵循获取写锁---> 再获取读锁---> 再释放写锁----> 释放读锁的顺序，写锁能够降级为读锁
 *
 *  如果一个线程占有了写锁，在不释放写锁的情况下，它还能占有读锁，即写锁降级为读锁
 *
 *  读没有完成时候，写锁无法获得锁，必须要等读锁读完后才有机会写
 *
 *
 * @author : leimingchao
 * @date Date : 2022年06月22日 7:15
 */
public class LockDownGradingDemo {

    public static void main(String[] args) {

        ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();

        ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();

        ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();

        // writeLock.lock();
        // System.out.println("-----写入");
        // writeLock.unlock();
        //
        // readLock.lock();
        // System.out.println("------读取");
        // readLock.unlock();


        //案例一：同一个线程
        // writeLock.lock();
        // System.out.println("-----写入");
        //
        // readLock.lock();
        // System.out.println("------读取");
        //
        // writeLock.unlock();
        //
        // readLock.unlock();

        //案例二：同一个线程


        readLock.lock();
        System.out.println("------读取");


        writeLock.lock();
        System.out.println("-----写入");

        writeLock.unlock();

        readLock.unlock();

    }
}
